//
//  RCDataBaseManager.h
//  RCDataBaseProject
//
//  Created by Roiy on 2017/7/31.
//  Copyright © 2017年 Roiy. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "RCResultSet.h"
#import <sqlite3.h>


@protocol RCDataBase <NSObject>

/**
 打开数据库

 @return 数据库是否打开
 */
-(BOOL)openDB;

/**
 关闭数据库

 @return 数据库是否关闭
 */
-(BOOL)closeDB;

/**
 执行基本操作（建表、插入、删除、更新）

 @param sql sql语句
 @return 操作响应是否成功
 */
-(BOOL)executeHandle:(NSString *)sql, ...;

/**
 执行结果集查询操作

 @param sql sql语句
 @return RCResultSet 实体
 */
- (id)executeQuery:(NSString *)sql, ...;

@end

@interface RCDataBaseManager : NSObject<RCDataBase>
{
    void*     _dataBase;
    NSTimeInterval      _startBusyRetryTime;
}

@property (nonatomic,assign)BOOL inTransaction;

@property (nonatomic) NSString *dataBasePath;

@property (nonatomic) NSTimeInterval maxBusyRetryTimeInterval; //超时重试时间。默认两秒

/**
 创建RCDataBaseManager实例

 @param dbPath 数据库路径
 @return 该类实体
 */
+(instancetype)databaseWithPath:(NSString *)dbPath;


/**
 创建RCDataBaseManager实例

 @param dbPath 数据库路径
 @return 该类实体
 */
-(instancetype)initWithPath:(NSString *)dbPath;

///-----------------------------------------------------------
/// 事物处理。遵循ACID特性
///-----------------------------------------------------------

/**
 开启事物

 @return 是否成功
 */
-(BOOL)beginTransaction;

/**
 开启延迟事物

 @return 是否成功
 */
-(BOOL)beginDeferredTransaction;

/**
 提交事物

 @return 提交事物是否成功
 */
-(BOOL)commitTransaction;

/**
 回滚事物

 @return 回滚是否成功
 */
-(BOOL)rollbackTransaction;

///-----------------------------------------------------------
/// 数据库加密，变更密钥、删除密钥。
///-----------------------------------------------------------

/**
 数据库加密

 @param dbKey 加密密钥
 @return 操作是否成功
 */
-(BOOL)setDataBaseKey:(NSString *)dbKey;

/**
 数据库加密（传入NSData类型密钥）[暴露内部实现方法，外界可直接传入data]
 例如：[NSData dataWithBytes:(void *)[dbKey UTF8String] length:(NSUInteger)strlen([dbKey UTF8String])]

 @param keyData 加密密钥（NSData类型）
 @return 操作是否成功
 */
-(BOOL)setKeyWithData:(NSData *)keyData;

/**
 数据库重置密钥、清空密钥

 @param dbKey 密钥
 @return 操作是否成功
 */
-(BOOL)reSetDataBaseKey:(NSString *)dbKey;

/**
 数据库重置密钥、清空密钥 （传入NSData类型密钥）[暴露内部实现方法，外界可直接传入data]
 例如：[NSData dataWithBytes:(void *)[dbKey UTF8String] length:(NSUInteger)strlen([dbKey UTF8String])]

 @param keyData 密钥（NSData类型）
 @return 操作是否成功
 */
-(BOOL)reSetDataBaseWithData:(NSData *)keyData;

///-----------------------------------------------------------
/// 数据库错误信息、错误状态码(带完善)
///-----------------------------------------------------------

/**
 获取库操作错误码

 @return 错误状态码
 */
- (int)lastDataBaseErrorCode;

/**
 获取库操作信息

 @return 错误信息
 */
- (NSString*)lastDataBaseErrorMessage;

///-----------------------------------------------------------
/// 数据库基本信息 (待完善)
///-----------------------------------------------------------



@end


@interface RCStatement : NSObject
{
    void *_statement;
}

@property (atomic,assign)void *statement;

@property (atomic,assign)BOOL inUse;

@property (atomic,copy)NSString *tmpString;

@end
